import java.util.*;
import java.io.*;
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.math.*;
/**
 * Write a description of class KLant here.
 * 
 * @author (your name) 
 * @version (a version number or a date)
 */
public class Klant implements Serializable
{
    // instance variables - replace the example below with your own
    private int aantalKeer;
    private String naam;
    private Supermarkt supermarkt;
    private ArrayList<Product> winkelwagen;
    private TuiHelper tuiHelper;
    private Bon bon;
    private boolean betaald;
   
    /**
     * Constructor for objects of class KLant
     */
    
    public Klant(String naam, Supermarkt supermarkt) {
        this.naam = naam;
        this.supermarkt = supermarkt;
        winkelwagen = new ArrayList<Product>();
        betaald = true;
    }
    
    //methoden
    
    //Betalen voor de producten in winkelmandje
    public void betaal(){
        String korting = "========================= \n";
        double totaal = 0.0;
        double totaalZonderKorting = 0.0;
        bon = supermarkt.addBon();
        bon.setTitel(getNaam() );
        TuiHelper.clear();
        if( !betaald ){
            // Als er producten in mandje zitten
            if (winkelwagen.size() > 0){
                for(Product product: winkelwagen){
                    int aantal = product.getAantal();
                    String naam = product.getNaam();
                    double prijs = product.getVerkoopPrijs();
                    totaalZonderKorting += prijs*aantal;
                    totaal += product.prijsWinkelmandje() ;
                    if ( product.korting() ){
                        if ( product.welkeKorting().equalsIgnoreCase("2voor1") ){
                            korting += naam + " heeft de korting 2 voor de prijs van 1 /n";  
                        }
                        if ( product.welkeKorting().equalsIgnoreCase("korting") ){
                            korting += naam + " heeft " + product.bekijkKorting() + " korting \n";
                        }
                    }
                    bon.addBonregel(aantal, product, prijs);
                    System.out.printf("%dx %s    %.2f,  %.2f%n", aantal, naam, prijs, prijs*aantal);
                }
                if(!naam.equalsIgnoreCase("Anoniem")){
                    totaal = checkKorting(totaal);
                }
                System.out.println(korting);
                bon.setTotaal(totaal);
                System.out.println("===================");
                System.out.printf("Totaal bedrag: %.2f%n", totaal);
                TuiHelper.drukafDrukEnterEnWachtOpEnter();
                betaald = true;
                aantalKeer ++;
            }
            // Geen producten in mandje
            else {
                TuiHelper.clear();
                System.out.println("U heeft nog geen artikelen in uw mandje ");
                TuiHelper.drukafDrukEnterEnWachtOpEnter();
            }
        }
        else{
            System.out.println("U heeft al betaald");
            TuiHelper.drukafDrukEnterEnWachtOpEnter();
        }
        if( betaald){
            for(Product product: winkelwagen){
                product.setAantalWinkelwagen( 0 );
            }
            winkelwagen.clear();
        }
        supermarkt.verwijderVoorraad();
    }
    
    public void winkelwagenLegen(){
        winkelwagen.clear();
    }
        
    public String getNaam(){
        return naam;
    }
    
    //Zoek product in winkel
    public Product zoekProduct(String naam){
        Product gezochtproduct = supermarkt.vraagProductOpWinkel( naam);
        return gezochtproduct;
    }
    
    //Check of product al in winkelwagen zit
    public boolean zitProductAlInWinkelwagen(String n){
        int i = 0;
        for( Product p:winkelwagen){
            if(p.getNaam().equalsIgnoreCase( n ) ){
                i++;
            }
        }
        if( i > 0 ){
            return true;
        }
        return false;
    }
    
    //Voegt een product toe aan de winkelwagen op naam
    public void addWinkelwagen(String naam){
        winkelwagen.add(zoekProduct(naam));
        betaald=false;
    }
    
    //Voeg product toe 
    public void addWinkelwagenProduct(Product product){
        winkelwagen.add( product );
        betaald=false;
    }
    
    public boolean betaald(){
        return betaald;
    }
    
    //Haalt alle producten uit winkelwagen op
    public ArrayList<Product> getWinkelwagen(){
        return winkelwagen;
    }
    
    public String totaalString(double totaalprijs){
        String s =  "Totaalprijs is : ";
        s += String.format("%.2f", totaalprijs);
        s += "EUR";
        return s;
    }
    
    //Laat de inhoud van het mandje op het scherm zien
    public void toonMandje(){          
        int i = 1;          
        double prijs= 0.0;
        double totaalprijs=0.0;
        TuiHelper.clear();
        for( Product p : winkelwagen ){
            System.out.println( i + ". " + p.toStringMandje() );              
            i++;              
            prijs += (p.getVerkoopPrijs()* p.getAantal() );  
            totaalprijs+=(p.getVerkoopPrijs()* p.getAantal());
        }      
        // Als er iets in het mandje zit             
        if(winkelwagen.size() > 0){              
            System.out.println("\n"+totaalString(totaalprijs));  
            int keuze = tuiHelper.stelVraagMetGetalAntwoord( "Vul het nummer van het product in om het te verwijderen uit mandje \n druk '0' om terug te keren" );     
            if( keuze== 0 ){                  
                TuiHelper.drukafDrukEnterEnWachtOpEnter();              
            }              
            // Verwijder product uit mandje              
            else {                
                
                int aantal = tuiHelper.stelVraagMetGetalAntwoord( "Vul het aantal te verwijderen producten in" );     
                returnProductAantal(winkelwagen.get(keuze-1), winkelwagen.get(keuze-1).getHoudbaarheidsDatum(), aantal);
                if(winkelwagen.get(keuze-1).getAantalWinkelwagen() == 0){
                    winkelwagen.remove(keuze-1);
                }
                if(winkelwagen.size()==0){
                    betaald=true;
                }
                TuiHelper.clear();
            }
        }
        else {  
            System.out.println("U heeft nog geen producten in uw mandje");
            TuiHelper.drukafDrukEnterEnWachtOpEnter();          
        }
    }
    
    //Verander aantal van product in mandje
    public void setAantal(String naam, int aantal){
        for (Product product : winkelwagen ){
            if ( product.getNaam().equalsIgnoreCase(naam) ) {
                product.addAantalWinkelwagen(aantal);
            }
        }
    }
    
    // Kijk of de klant in aanmerking komt voor korting (Bedrag boven 100)
    public double checkKorting(double korting){
        if(korting > 100){
            System.out.printf("Uw bedrag is : %.2f%n\n", korting);
            System.out.println("U krijgt 5% korting!");
            return korting * 95 / 100;
        }
        else return korting;
    }
    
    public String toString(){
        return naam + " heeft " + aantalKeer + " keer wat gekocht";
    }
    
    //Returned 'verwijderdeProduct' terug naar de stelling
    public void returnProduct(Product verwijderdeProduct, Datum datum){
        supermarkt.plusVoorraadAfdeling(verwijderdeProduct , verwijderdeProduct.getAantal(), datum);
    }
    
    public void returnProductAantal(Product verwijderdeProduct, Datum datum, int aantal){
        verwijderdeProduct.plusVoorraadAfdeling( aantal, datum);
        verwijderdeProduct.minAantalWinkelwagen(aantal, datum);
    }
    
    public ArrayList<Bon> getBon(){
        ArrayList<Bon> bonnen = new ArrayList<Bon>();
        for(Bon bon : supermarkt.getBonnen() ){
            if(bon.getTitel().equalsIgnoreCase(naam) ){
                bonnen.add(bon);
            }
        }
        return bonnen;
    }
    
    public Afdeling vaakstBezochtAfdeling(){
        ArrayList<Bon> bonnen = new ArrayList<Bon>();
        bonnen = getBon();
        Afdeling afdeling = null;
        
        return afdeling;
    }
    
    //STELEN :D:D
    public void stelen(){
        double faal = Math.random() * 10;
        double bedrag=0.0;
        if (faal<3){
            System.out.println("De volgende producten zijn gestolen!");
            for(Product p : winkelwagen){
                System.out.println(p.getNaam() + " is "+p.getAantal()+" keer gestolen!");
                bedrag += (p.getVerkoopPrijs() * p.getAantal());
                
            }
            System.out.println("De totale buit is "+bedrag);
            winkelwagen.clear();
            betaald=true;
        }
        else{
            System.out.println("Stelen faalt! "+ naam +" jij mag je leven verder in de cel uitzitten.");
            for(Product p : winkelwagen){
                bedrag += (p.getVerkoopPrijs() * p.getAantal());
                //returnProductAantal(p, p.getHoudbaarheidsDatum(),p.getAantalWinkelwagen());
            }
            for(Product p : winkelwagen){
                returnProductAantal(p, p.getHoudbaarheidsDatum(),p.getAantalWinkelwagen());
            }
            winkelwagen.clear();
            System.out.println("U mag ook nog een boete van "+bedrag*5+" betalen");
            supermarkt.plusGeld(bedrag);
            betaald=true;
        }
    }
    
    //Als lui iets uit je winkelmandje jatten..
    public void wordBestolen(){
        boolean bestolen=false;
        if(winkelwagen.size()!=0){
            for(Product p : winkelwagen){
                double random = Math.random()*10;
                double aantal = Math.random()*10+1;
                if(random<1){
                    if(p.getAantalWinkelwagen() < (int)aantal){
                        p.minAantalWinkelwagen(p.getAantalWinkelwagen());
                        bestolen=true;
                        String gestolenProduct = p.getNaam()+" zijn allemaal gestolen! ";
                        System.out.println(gestolenProduct);
                    }
                    else{
                        p.minAantalWinkelwagen((int)aantal);
                        bestolen=true;
                        String gestolenProduct = "Het product "+p.getNaam()+" is ";
                        gestolenProduct += (int)aantal + " keer gestolen";
                        System.out.println(gestolenProduct);
                    }
                }
            }
        }
        else{
            System.out.println("Een dief wou u bestelen. Gelukkig viel er niks te stelen ^_^;");
        }
    }
}
